package com.jian.java;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.IOException;

/**
 * @author Jiange
 * @create 2021-04-10-11:39
 */
public class MyFilter implements Filter {

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;

        HttpSession session = httpServletRequest.getSession();
        Object user = session.getAttribute("user");
        if(user == null){
            httpServletRequest.getRequestDispatcher("/jian").forward(servletRequest,servletResponse);
        }else {
            filterChain.doFilter(servletRequest,servletResponse);
            //返回资源执行接下来的后续方法 逆序调用后续的方法  多个过滤器是按照在web.xml里面配置的顺序执行
            //多个过滤器默认都在同一个线程执行  都使用的同一个request对象
            //<url-pattern>/</url-pattern>精确匹配
            //<url-pattern>/jian/*</url-pattern>目录匹配
            //<url-pattern>*.txt</url-pattern> 后缀名匹配不能以/开头
            //不关心资源是否存在
        }
        /**
         * filter的生命周期
         * 1.构造器
         * 2.init
         * 前两个方法在工程启动的时候就被创建好了  只执行一次
         * dofilter  每次拦截到请求都会执行
         * destory  在停止web工程的时候就会调用
         */
        //ThreadLocal可以解决多线程的安全问题
        /**
         * 可以给当前线程关联一个数据 只能一个
         * 每个ThreadLocal实例定义时一般是static 在线程销毁时 保存的数据会由jvm自动释放 间接调用servlet程序
         * 回去到最后set的数据
         */
        ThreadLocal<Object> objectThreadLocal = new ThreadLocal<>();
        objectThreadLocal.set(10);

    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        String filterName = filterConfig.getFilterName();
        String jain = filterConfig.getInitParameter("jain");
        ServletContext servletContext = filterConfig.getServletContext();
    }
}
